home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML Instance.sea / XML Instance / Required / plugins / HTMLWindow.jar / horst / EditableHTMLDocument.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-18  |  4.9 KB  |  174 lines

  1. package horst;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.PrintWriter;
  6. import java.util.Vector;
  7.  
  8. public class EditableHTMLDocument extends HTMLDocument {
  9.    public EditableHTMLDocument(HTMLPane renderer) {
  10.       super(renderer);
  11.    }
  12.  
  13.    void findSelectedElements(Element e, Vector selectedElements, int p0, int p1) {
  14.       if (e.getType() == 9 && inRange(e, p0, p1)) {
  15.          selectedElements.addElement(e);
  16.       }
  17.  
  18.       int nCount = e.getElementCount();
  19.  
  20.       for(int i = 0; i < nCount; ++i) {
  21.          this.findSelectedElements(e.getElementAt(i), selectedElements, p0, p1);
  22.       }
  23.  
  24.    }
  25.  
  26.    public Vector getSelectedElements() {
  27.       Vector v = new Vector();
  28.       if (((HTMLDocument)this).isTextSelected()) {
  29.          this.findSelectedElements(super.m_rootElement, v, super.m_selectedP0, super.m_selectedP1);
  30.       }
  31.  
  32.       return v;
  33.    }
  34.  
  35.    Element getTextAttributeElement(int type) {
  36.       switch (type) {
  37.          case 38:
  38.          case 40:
  39.          case 41:
  40.          case 42:
  41.          case 46:
  42.          case 48:
  43.          case 52:
  44.          case 55:
  45.          case 56:
  46.          case 57:
  47.          case 58:
  48.          case 59:
  49.          case 60:
  50.          case 68:
  51.          case 72:
  52.          case 73:
  53.          case 74:
  54.             return new Element(type);
  55.          default:
  56.             return null;
  57.       }
  58.    }
  59.  
  60.    static boolean inRange(Element e, int p0, int p1) {
  61.       return e.m_p0 <= p0 && e.m_p1 >= p0 || e.m_p0 >= p0 && e.m_p0 <= p1 || e.m_p0 >= p0 && e.m_p1 <= p1;
  62.    }
  63.  
  64.    static boolean isTotallyInRange(Element e, int p0, int p1) {
  65.       return e.m_p0 >= p0 && e.m_p1 <= p1;
  66.    }
  67.  
  68.    public void setSelectedTextProperties(int[] atts) {
  69.       ((HTMLDocument)this).printTree(super.m_rootElement, 0);
  70.       HTMLDocument.closeLog();
  71.       Vector selectedElements = new Vector();
  72.       Vector v = this.getSelectedElements();
  73.  
  74.       for(int i = v.size() - 1; i >= 0; --i) {
  75.          Element e = (Element)v.elementAt(i);
  76.          new String(e.getCharData());
  77.          if (isTotallyInRange(e, super.m_selectedP0, super.m_selectedP1)) {
  78.             selectedElements.addElement(e);
  79.          } else {
  80.             ElementSplit[] splits = splitElement(e, super.m_selectedP0, super.m_selectedP1);
  81.             if (e.m_parent != null) {
  82.                Element[] newElems = new Element[splits.length];
  83.  
  84.                for(int h = 0; h < splits.length; ++h) {
  85.                   newElems[h] = splits[h].m_elem;
  86.                }
  87.  
  88.                e.m_parent.replaceChildElement(e, newElems);
  89.  
  90.                for(int h = 0; h < splits.length; ++h) {
  91.                   if (splits[h].m_bSelected) {
  92.                      selectedElements.addElement(splits[h].m_elem);
  93.                   }
  94.                }
  95.             }
  96.          }
  97.       }
  98.  
  99.       boolean bRebuildViews = false;
  100.  
  101.       for(int i = 0; i < atts.length; ++i) {
  102.          for(int j = 0; j < selectedElements.size(); ++j) {
  103.             Element attElement = this.getTextAttributeElement(atts[i]);
  104.             if (attElement != null) {
  105.                bRebuildViews = true;
  106.                Element selectedElem = (Element)selectedElements.elementAt(j);
  107.                selectedElem.m_parent.replaceChildElement(selectedElem, attElement);
  108.                new String(selectedElem.getCharData());
  109.                attElement.addChild(selectedElem);
  110.                attElement.m_doc = selectedElem.m_doc;
  111.             }
  112.  
  113.             ((HTMLDocument)this).printTree(super.m_rootElement, 0);
  114.             HTMLDocument.closeLog();
  115.          }
  116.       }
  117.  
  118.       if (bRebuildViews) {
  119.          try {
  120.             File f = new File("c:\\browser\\out.html");
  121.             FileOutputStream os = new FileOutputStream(f);
  122.             PrintWriter pw = new PrintWriter(os);
  123.             ((HTMLDocument)this).writeToStream(pw);
  124.             pw.flush();
  125.             pw.close();
  126.          } catch (Exception ex) {
  127.             System.out.println("Exception: " + ex);
  128.          }
  129.       }
  130.  
  131.    }
  132.  
  133.    static ElementSplit[] splitElement(Element e, int p0, int p1) {
  134.       if (p0 > p1) {
  135.          int temp = p0;
  136.          p0 = p1;
  137.          p1 = temp;
  138.       }
  139.  
  140.       new String(e.getCharData());
  141.       ElementSplit[] splits = new ElementSplit[0];
  142.       if (e.m_p0 < p0 && e.m_p1 > p1) {
  143.          splits = new ElementSplit[3];
  144.          Element newElem = new Element(e);
  145.          newElem.setTextPointers(e.m_p0, p0 - 1);
  146.          splits[0] = new ElementSplit(newElem, false);
  147.          newElem = new Element(e);
  148.          newElem.setTextPointers(p0, p1);
  149.          splits[1] = new ElementSplit(newElem, true);
  150.          newElem = new Element(e);
  151.          newElem.setTextPointers(p1 + 1, e.m_p1);
  152.          splits[2] = new ElementSplit(newElem, false);
  153.       } else if (e.m_p0 < p0 && e.m_p1 > p0) {
  154.          splits = new ElementSplit[2];
  155.          Element newElem = new Element(e);
  156.          newElem.setTextPointers(e.m_p0, p0 - 1);
  157.          splits[0] = new ElementSplit(newElem, false);
  158.          newElem = new Element(e);
  159.          newElem.setTextPointers(p0, e.m_p1);
  160.          splits[1] = new ElementSplit(newElem, true);
  161.       } else if (e.m_p0 > p0 && e.m_p0 < p1 && e.m_p1 > p1) {
  162.          splits = new ElementSplit[2];
  163.          Element newElem = new Element(e);
  164.          newElem.setTextPointers(e.m_p0, p1);
  165.          splits[0] = new ElementSplit(newElem, true);
  166.          newElem = new Element(e);
  167.          newElem.setTextPointers(p1 + 1, e.m_p1);
  168.          splits[1] = new ElementSplit(newElem, false);
  169.       }
  170.  
  171.       return splits;
  172.    }
  173. }
  174.